import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Enumerate } from './entities/enumerate.entity';
import { CreateEnumerateDto } from './dto/create-enumerate.dto';
import { UpdateEnumerateDto } from './dto/update-enumerate.dto';
import * as path from 'node:path';
import * as fs from 'node:fs';
import { EnumData } from '../interface/enumerate-data.interface'; // 引入实体类

@Injectable()
export class EnumerateService {
  private enumsFolderPath = path.join(process.cwd(), 'src', 'json'); // 枚举文件夹路径

  constructor(
    @InjectRepository(Enumerate)
    private readonly enumerateRepository: Repository<Enumerate>,
  ) {}

  // 创建枚举
  async createEnum(createDto: CreateEnumerateDto): Promise<Enumerate> {
    const enumEntity = this.enumerateRepository.create(createDto);
    return await this.enumerateRepository.save(enumEntity);
  }

  // 1. 清空表并导入枚举数据
  async importEnumData(): Promise<void> {
    // 读取枚举类并批量导入数据
    const enumsData: EnumData[] = [];
    try {
      // 获取文件夹路径，假设枚举类位于 enums 文件夹中

      // 获取所有文件
      const files = fs.readdirSync(this.enumsFolderPath);

      for (const file of files) {
        // 确保只处理 .ts 文件
        if (file.endsWith('.enum.json')) {
          const filePath = path.join(this.enumsFolderPath, file);

          // 动态导入枚举文件
          const enumModule = await import(filePath);

          for (const enumModuleObj of enumModule) {
            enumsData.push(enumModuleObj);
          }
        }
      }
    } catch (error) {
      console.error('导入枚举数据失败:', error);
      throw new Error('导入枚举数据失败');
    }
    // 清空枚举表
    await this.enumerateRepository.clear();
    await this.bulkCreateEnums(enumsData);
  }

  // 获取所有枚举
  async getAllEnums(): Promise<Enumerate[]> {
    return await this.enumerateRepository.find();
  }

  // 获取单个枚举
  async getEnumById(id: number): Promise<Enumerate> {
    return await this.enumerateRepository.findOneById(id);
  }

  // 更新枚举
  async updateEnum(
    id: number,
    updateDto: UpdateEnumerateDto,
  ): Promise<Enumerate> {
    await this.enumerateRepository.update(id, updateDto);
    return this.getEnumById(id);
  }

  // 删除单个枚举
  async deleteEnum(id: number): Promise<void> {
    await this.enumerateRepository.delete(id);
  }

  // 批量添加枚举
  async bulkCreateEnums(
    createDtos: CreateEnumerateDto[],
  ): Promise<Enumerate[]> {
    const enumEntities = this.enumerateRepository.create(createDtos);
    return await this.enumerateRepository.save(enumEntities);
  }

  // 批量删除枚举
  async bulkDeleteEnums(ids: number[]): Promise<void> {
    await this.enumerateRepository.delete(ids);
  }
}
